﻿/*********************************************************************
 *
 *            J1939 Main Source Code
 *
 *********************************************************************
 *
 *    本程序是由XieTongXueFlyMe对现有的J1939协议文档分析，和对前辈的贡献总结,
 * 写出的一套开源的J1939驱动。
 *    本协议特点：
 *        1.易移植（不针对特定的CAN硬件，只要满足CAN2.0B即可）
 *        2.轻量级（可适应低端的MCU）
 *        3.支持多任务调用接口（可用于嵌入式系统）
 *        4.双模式（轮询或者中断，逻辑更加简单明了）
 *        5.不掉帧（数据采用收发列队缓存）
 *
 *  源代码下载：
 *        https://github.com/XeiTongXueFlyMe/J1939
 *  源代码临时手册Web站点：
 *        https://xeitongxueflyme.github.io/j1939doc.github.io/
 *
 * Version     Date        Description
 * -------------------------------------------------------------------
 * v1.0.0     2017/06/04    首个版本 Version 1 测试版发布
 * v1.0.1     2017/08/04    完善功能
 * v1.1.0     2017/11/22    Version 1 稳定发布版
 * v2.0.1     2017/11/24    Version 2 测试版发布
 * v2.0.2     2018/01/03    解决V2.0.1 遗留问题
 * v2.1.0     2018/01/20    Version 2 稳定发布版
 * Author               Date         changes
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *XeiTongXueFlyMe       7/06/04      首个版本
 *XeiTongXueFlyMe       7/08/04      增加对TP的支持
 *XeiTongXueFlyMe       7/11/24      增加对多路CAN硬件的收发，和报文处理
 *XeiTongXueFlyMe       7/11/29      增加请求和响应API
 *XeiTongXueFlyMe       7/12/07      重做TP接受API函数
 *XeiTongXueFlyMe       7/12/08      增加软件滤波器
 *XeiTongXueFlyMe       8/01/03      重做接受发送API，简化协议栈初始化调用逻辑
 **********************************************************************/

#ifndef __J1939_Config_H
#define __J1939_Config_H

#include "J1939.h"
#include "ICANCmd.h"
#include "can_driver.h"
#include <string.h>
#include <stdio.h>

/***************************J1939 地址配置*****************************/
//设备默认的地址（地址命名是有规定的，参考J1939的附录B 地址和标识符的分配）
#define J1939_STARTING_ADDRESS_1 0x14
#define J1939_STARTING_ADDRESS_2 244
#define J1939_STARTING_ADDRESS_3 247
#define J1939_STARTING_ADDRESS_4 0

/******************************J1939功能配置***************************/
#define J1939_RX_QUEUE_SIZE 10
//当mcu来不及处理消息，接收消息列队是否允许被新的消息覆盖
#define J1939_OVERWRITE_RX_QUEUE J1939_FALSE
#define J1939_TX_QUEUE_SIZE 10
//当mcu来不及处理消息，发送消息列队是否允许被新的消息覆盖
#define J1939_OVERWRITE_TX_QUEUE J1939_FALSE
//是否使用轮询模式（否则使用中断模式）
#define J1939_POLL_ECAN J1939_TRUE
//是否启用软件滤波器
#define J1939SoftwareFilterEn J1939_FALSE
/******************************J1939移植配置函数************************/

#define Port_CAN_Transmit(MsgPtr) J1939_CAN_Transmit(MsgPtr)
#define Port_CAN_Receive(MsgPtr) J1939_CAN_Receive(MsgPtr)
#define Port_SetAddressFilter(Address) J1939_SetAddressFilter(Address)
/*不使用中断模式，不对下面的函数进行移植*/
#if J1939_POLL_ECAN == J1939_FALSE
#define Port_RXinterruptEnable() J1939_RXinterruptEnable()
#define Port_RXinterruptDisable() J1939_RXinterruptDisable()
#define Port_TXinterruptEnable() J1939_TXinterruptEnable()
#define Port_TXinterruptDisable() J1939_TXinterruptDisable()
#define Port_TXinterruptOk() J1939_TXinterruptOk()
#define Port_CAN_identifier_clc() CAN_identifier_clc()
#endif

void J1939_SetAddressFilter(unsigned char Ps_Address);
void J1939_CAN_Transmit(J1939_MESSAGE *MsgPtr);
int J1939_CAN_Receive(J1939_MESSAGE *MsgPtr);

/* Wingbow Add */
bool J1939_TP_RX_Ready();

#endif
